<?php
namespace app\index\controller;

use Hanson\Vbot\Foundation\Vbot;
use Hanson\Vbot\Message\Text;
use Illuminate\Support\Collection;
use think\facade\Env;
use util\Log;

class Boot
{

    // private $worker;
    private $options; //配置文件

    /**
     *
     * @param [type] $session_id
     * @param [type] $pid
     */
    public function __construct($session_id, $pid)
    {
        //配置文件
        $path = Env::get('runtime_path') . 'boot_tmp/';
        $this->options = [
            'path' => $path,
            /*
             * swoole 配置项（执行主动发消息命令必须要开启，且必须安装 swoole 插件）
             */
            'swoole' => [
                'status' => false,
                'ip' => '127.0.0.1',
                'port' => '8866',
            ],
            /*
             * 下载配置项
             */
            'download' => [
                'image' => true,
                'voice' => true,
                'video' => true,
                'emoticon' => true,
                'file' => true,
                'emoticon_path' => $path . 'emoticons', // 表情库路径（PS：表情库为过滤后不重复的表情文件夹）
            ],
            /*
             * 输出配置项
             */
            'console' => [
                'output' => true, // 是否输出
                'message' => true, // 是否输出接收消息 （若上面为 false 此处无效）
            ],
            /*
             * 日志配置项
             */
            'log' => [
                'level' => 'debug',
                'permission' => 0777,
                'system' => $path . 'log', // 系统报错日志
                'message' => $path . 'log', // 消息日志
            ],
            /*
             * 缓存配置项
             */
            'cache' => [
                'default' => 'file', // 缓存设置 （支持 redis 或 file）
                'stores' => [
                    'file' => [
                        'driver' => 'file',
                        'path' => $path . 'cache',
                    ],
                    'redis' => [
                        'driver' => 'redis',
                        'connection' => 'default',
                    ],
                ],
            ],
            /*
             * 拓展配置
             * ==============================
             * 如果加载拓展则必须加载此配置项
             */
            'extension' => [
                // 管理员配置（必选），优先加载 remark_name
                'admin' => [
                    'remark' => '',
                    'nickname' => '',
                ],
            ],

            //定义配置文件 传递的参数
            'session_id' => $session_id,
            'pid' => $pid,
        ];
        //$this->worker = $worker;
        //  $this->options['session_id'] = $session_id;
        //  $this->options['pid'] = $pid;
    }


    /**
     * swoole调用该方法
     *
     * @param [type] $session_id
     * @param [type] $pid
     * @return void
     */
    public function boot_run()
    {
        //开启机器人
        $vbot = new Vbot($this->options);
        // 获取监听器实例
        $observer = $vbot->observer;
        //二维码监听器
        $observer->setQrCodeObserver(function ($qrCodeUrl) {
            Log::info('qrCodeUrl' . $qrCodeUrl);
            Log::info('当前进程:' . $this->options['pid']);
            //生成二维码
            $session_id = $this->options['session_id'];
            if ($session_id) {
                Log::info('当前session_id:' . $session_id);
                $result['code'] = 1;
                $result['qrCodeUrl'] = $qrCodeUrl;
                cache($session_id, $result, 600);
            } else {
                $result['code'] = -1;
                $result['msg'] = '未获取到session_id';
                cache($session_id, $result, 600);
            }
        });

        //免扫码登录成功时回调。
        $observer->setReLoginSuccessObserver(function () {
            Log::info('免扫码登录');
        });

        //登录成功时回调。无论是第一次登录还是免扫码登录均会触发。
        $observer->setLoginSuccessObserver(function () {
            $myself = vbot('myself');
            //$groups = vbot('groups');
            //Log:info('login_groups' . gettype($groups));
            Log::info('登录成功，当前用户昵称: ' . $myself->nickname . ',用户uin: ' . $myself->uin . '用户sex:' . $myself->sex);
            Log::info('无论是第一次登录还是免扫码登录均会触发');
        });

        //程序退出时回调。
        $observer->setExitObserver(function () {
            //$params = PARAMS; //定义的常量
            // $session_id = $params['1'];
            $session_id = $this->options['session_id'];
            cache('user_info' . $session_id, null); // 清除用户缓存信息
            Log::info('程序正常退出');
            // $this->worker->write('程序退出');
        });

        //好友监听器  此回调仅在初始化好友时执行。
        //变量 $contacts 含有数组下表 ‘friends’,’groups’,’officials’,’special’,’members’
        $observer->setFetchContactObserver(function (array $contacts) {
            $myself = vbot('myself');  //获取好友
            $groups = vbot('groups'); //获取组
            $myInfo['uin'] = $myself->uin;
            $myInfo['nickname'] = $myself->nickname;
            $myInfo['sex'] = $myself->sex;

            $session_id = $this->options['session_id'];
            $pid = $this->options['pid'];
            cache('login' . $session_id, null); //清除登陆缓存
            $result['code'] = 1;
            $result['msg'] = '用户登录成功';
            $result['my'] =$myInfo;
            cache('login' . $session_id, $result, 600);
        });
        
        //当接收消息异常时，当系统判断为太久没从手机端打开微信时，则急需打开，时间过久将断开。
        $observer->setNeedActivateObserver(function () {
            $session_id = $this->options['session_id'];
            cache('user_info' . $session_id, null); //清除用户缓存信息
            Log::info('消息异常或断开');
        });
        
        //处理消息
        $vbot->messageHandler->setHandler(function (Collection $message) {
            $myself = vbot('myself');
            $fromType = $message['fromType'];
            //判断消息发送者信息 System:系统消息 Self:自己发送的消息 Group:群组消息 Friend:联系人消息 Official:公众号消息 Special:特殊账号消息 Unknown:未知消息
          //  if ($fromType != 'System') {
           // }

           //打印消息内容
           Log::info('message' . var_export($message, true));

            switch ($fromType) {
                case 'Self':
                    //当主动发送消息，只有发送给文件助手才会恢复消息
                    if ($message['from']['UserName'] == 'filehelper') {
                        //  $groups = vbot('groups'); //获取群成员
                        $this->sendMessageToSelf($message);
                    }
                    break;
                case 'Friend':
                    break;
                case 'Group':
                    break;
            }
        });
        $vbot->server->serve();
    }

    /**
     *发送消息给自己（文件助手）
     *
     * @param [type] $message
     * @return void
     */
    public function sendMessageToSelf($message)
    {
        Text::send($message['from']['UserName'], 'Hi, 我是文件助手');
    }

}
